package com.road.vast.springboot.project.controller;


import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.apache.shiro.authz.annotation.RequiresRoles;
import org.apache.shiro.crypto.hash.Md5Hash;
import org.apache.shiro.session.Session;
import org.apache.shiro.subject.Subject;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpSession;
import java.io.Serializable;
import java.util.Enumeration;

/**
 * <p>
 *  前端控制器
 * </p>
 *
 * @author 郭泽鹏
 * @since 2020-08-01
 */
@RestController
@RequestMapping("/project")
public class PeUserController {
    /**
     * 1.传统登录
     *      前端发送登录请求 =》 接口部分获取用户名和密码 =》 程序员在接口部分手动控制
     * 2.shiro登录
     *      前端发送登录请求 =》 接口部分获取用户名和密码 =》 通过subject.login => realm域的认证方法
     */
    @PostMapping(value = "/login")
    public String login(String username, String password){
        try {
            /**
             * 对密码进行加密：
             *      shiro使用md5进行加密
             *      Md5Hash：
             *          参数一：加密的内容
             *              111111      --Md5加密后--      abcd
             *          参数二：盐（加密的混淆字符串）（一般使用用户登录的用户名）
             *              111111+混淆字符串
             *          参数三：加密次数
             */
            password = new Md5Hash(password, username, 3).toString();
            //构造登录令牌
            UsernamePasswordToken token = new UsernamePasswordToken(username, password);
            //获取subject
            Subject subject = SecurityUtils.getSubject();

            //获取session
            String sid = (String) subject.getSession().getId();


            //调用subject进行登录
            subject.login(token);
            return "登录成功， sid :" + sid;
        }catch (Exception e){
            return "用户名或密码错误";
        }
    }

    /**
     * 个人主页
     * 配置具有某种权限才能访问     --      第二种方式
     * 使用shiro注解方式鉴权
     * @RequiresPermissions     --访问此方法必须具备的权限
     * @RequiresRoles           --访问此方法必须具备的角色
     * 1.过滤器：如果权限信息不匹配，则跳转到setUnauthorizedUrl指定的路径
     * 2.注解：抛出异常
     */
    @RequiresPermissions("user-home")
    @RequestMapping("/user/home")
    public String home(){
        return "访问个人主页成功";
    }

    /**
     * 添加
     */
    @PostMapping("/user")
    public String add(){
        return "添加用户成功";
    }

    /**
     * 查询
     */
    @GetMapping("/user")
    public String find(){
        return "查询用户成功";
    }

    /**
     * 更新
     */
    @PutMapping("/user")
    public String update(){
        return "更新用户成功";
    }

    /**
     * 删除
     */
    @DeleteMapping("/user")
    public String delete(){
        return "删除用户成功";
    }

    /**
     * 未登录或者未授权跳转的页面
     */
    @RequestMapping("/user/autherror/{code}")
    public String autherror(@PathVariable int code){
        return code == 1 ? "未登录" : "未授权";
    }

    //登录成功后，打印所有session内容
    @RequestMapping(value="/show")
    public String show(HttpSession session) {
        // 获取session中所有的键值
        Enumeration<?> enumeration = session.getAttributeNames();
        // 遍历enumeration中的
        while (enumeration.hasMoreElements()) {
            // 获取session键值
            String name = enumeration.nextElement().toString();
            // 根据键值取session中的值
            Object value = session.getAttribute(name);
            // 打印结果
            System.out.println("<B>" + name + "</B>=" + value + "<br>/n");
        }
        return "查看session成功";
    }
}

